#
# Created: 2025-07-27

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm  # 字体管理模块
import pandas as pd
import numpy as np
from pathlib import Path  # 路径处理模块

COLOR_MAP = {
    'A': '#1f77b4',  # 蓝
    'B': '#ff7f0e',  # 橙
    'C': '#2ca02c',  # 绿
    'D': '#d62728',  # 红
    'E': '#9467bd',  # 紫
    'F': '#8c564b',  # 棕
    'G': '#e377c2',  # 粉
    'H': '#7f7f7f'   # 灰
}

# ==================== 第一部分：字体设置 ====================
def set_fonts():
    """
    设置中英文字体（自动适应不同系统环境）
    返回：中文字体属性对象（如失败则返回None）
    """
    # ---- 英文字体设置 ----
    try:
        plt.rcParams['font.family'] = 'Times New Roman'  # 首选Times New Roman
    except:
        plt.rcParams['font.family'] = 'serif'  # 备用通用衬线字体
        print("注意：Times New Roman不可用，已使用默认衬线字体")

    # ---- 中文字体设置 ----
    try:
        # 方案1：检查Windows系统字体目录（适用于Windows用户）
        win_font = Path('C:/Windows/Fonts/simhei.ttf')  # 黑体字体路径
        if win_font.exists():
            print("检测到Windows系统黑体字体")
            return fm.FontProperties(fname=str(win_font))

        # 方案2：检查当前脚本目录（推荐使用）
        # 将simhei.ttf字体文件放在与脚本相同的目录下
        local_font = Path(__file__).parent / 'simhei.ttf'
        if local_font.exists():
            print("检测到本地黑体字体文件")
            return fm.FontProperties(fname=str(local_font))

        # 方案3：查找系统已有中文字体（跨平台兼容）
        print("正在搜索系统中可用的中文字体...")
        for font in fm.fontManager.ttflist:
            # 查找名称包含"hei"(黑)或"zen"(文泉驿)的字体
            if 'hei' in font.name.lower() or 'zen' in font.name.lower():
                print(f"找到中文字体: {font.name}")
                plt.rcParams['font.sans-serif'] = [font.name]  # 设置为全局字体
                return fm.FontProperties(fname=font.fname)
    except Exception as e:
        print(f"字体设置过程中发生错误: {str(e)}")

    print("警告: 未找到合适的中文字体，将仅显示英文")
    return None


# ==================== 第二部分：主程序 ====================
if __name__ == "__main__":
    # ---------- 1. 初始化字体设置 ----------
    print("\n=== 正在初始化字体设置 ===")
    cn_font = set_fonts()  # 获取中文字体对象

    # ---------- 2. 加载数据文件 ----------
    print("\n=== 正在加载数据 ===")
    # 重要提示：修改以下文件名为您实际的CSV文件路径
    data_file = 'radar_data.csv'  # 默认查找当前目录下的radar_data.csv文件

    try:
        # 读取CSV文件，假设第一列是组名（如A,B,C...）
        df = pd.read_csv(data_file, index_col=0)
        # 检查数据维度
        if len(df) < 8:
            print(f"注意：数据只有{len(df)}组，将只绘制{len(df)}个雷达图")
        elif len(df) > 8:
            print(f"注意：数据有{len(df)}组，将只绘制前8组数据")
    except FileNotFoundError:
        print(f"错误：未找到数据文件 '{data_file}'")
        exit()
    except Exception as e:
        print(f"数据加载失败: {str(e)}")
        exit()

    # ---------- 3. 创建画布 ----------
    print("\n=== 正在创建画布 ===")
    # 参数说明：
    # figsize=(10,7) - 画布尺寸（英寸），10宽×7高
    # subplot_kw={'polar':True} - 所有子图都设置为极坐标
    fig, axes = plt.subplots(2, 4, figsize=(10, 7), subplot_kw={'polar': True})

    # 设置主标题（中文/英文）
    # main_title = "八组数据雷达图分析" if cn_font else "Radar Chart Analysis"
    # if cn_font:
    #     fig.suptitle(main_title, fontproperties=cn_font, y=1.05, size=12)
    # else:
    #     fig.suptitle(main_title, y=1.05, size=16)
    # print(f"主标题设置为: '{main_title}'")

    # ---------- 4. 绘制雷达图 ----------
    print("\n=== 开始绘制雷达图 ===")
    # 颜色循环使用matplotlib默认颜色序列（C0-C7对应不同颜色）
    for i, ax in enumerate(axes.flat):
        # 处理数据不足8组的情况
        if i >= len(df):
            print(f"子图 {i + 1} 无数据，已禁用")
            ax.axis('off')  # 关闭多余子图
            continue

        # 获取当前组的数据
        group_name = df.index[i]  # 组名（如A、B、C...）
        values = df.iloc[i].values  # 数值数组
        num_vars = len(values)  # 变量数量

        # 计算角度（均匀分布）
        angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False)
        # 闭合图形（连接首尾点）
        closed_angles = np.concatenate((angles, [angles[0]]))
        closed_values = np.concatenate((values, [values[0]]))
        # 使用自定义颜色
        color = COLOR_MAP[group_name]
        # ---- 绘制雷达图 ----
        # 绘制填充区域（半透明）
        ax.fill(angles, values, color=color, alpha=0.25)
        # 绘制边界线
        ax.plot(closed_angles, closed_values, color=color, linewidth=2)

        # ---- 极坐标设置 ----
        ax.set_theta_offset(np.pi / 2)  # 将0度位置调整到顶部
        ax.set_theta_direction(-1)  # 顺时针方向

        # ---- 刻度标签设置 ----
        # 变量名称标签（使用英文，自动Times New Roman）
        ax.set_xticks(angles)
        ax.set_xticklabels(df.columns, fontsize=14, color='#333333')

        # 半径刻度标签
        ax.set_rlabel_position(30) #标签位置顺时针30度
        ax.set_yticks([10, 20, 30])  # 固定刻度值
        plt.ylim(0, 40)
        ax.tick_params(axis='y', labelsize=12, colors='grey')

        # ---- 边框设置 ----
        ax.spines['polar'].set_visible(True)  # 显示极坐标边框
        ax.spines['polar'].set_color('#c1c1c1')  # 浅灰色边框
        ax.spines['polar'].set_linewidth(1)  # 1磅粗细

        # ---- 标题设置 ----
        title = f"组别 {group_name}" if cn_font else f"Group {group_name}"
        # 第一行（A-D组）保持原样
        if i < 4:  # 第一行
            title_pad = 20  # 默认间距
        else:  # 第二行（E-H组）
            title_pad = 30  # 增加5个单位的间距
        if cn_font:
            ax.set_title(title, fontproperties=cn_font, pad=20,color=color,fontsize=16)
        else:
            ax.set_title(title, pad=20)
        print(f"已绘制 {title}")

    # ---------- 5. 保存和显示 ----------
    print("\n=== 保存输出文件 ===")
    output_file = 'radar_chart.png'
    plt.subplots_adjust(hspace=0.5)  # 调整行间距
    plt.tight_layout()  # 自动调整子图间距
    plt.savefig(output_file, dpi=300, bbox_inches='tight')

    print("\n=== 显示图表 ===")
    plt.show()